#!/bin/bash

# ===============================================
# Nacos 配置自动刷新脚本（支持 namespace + 配置项）
# 适用版本：Nacos 2.0.3 及以上
# 说明：
# - 本脚本将自动刷新 NAMESPACE_LIST 中定义的 namespace
# - 并将 $CONFIG_DIR 目录下对应 namespace 的配置文件刷入
# - 配置文件目录结构要求：
#   $CONFIG_DIR/$NAMESPACE/$GROUP/*.properties 或 *.yaml
#   示例：v1.3.7/dev-local/DEFAULT_GROUP/xx.yaml
# ===============================================

# === 配置项 ===
NACOS_ADDR="localhost:8848"
USERNAME="nacos"
PASSWORD="nacos"
CONFIG_DIR="/Users/xuyudong/IdeaProjects/pipeline-Integration/shell/nacos/mac/v1.3.7"

# === 待创建的 namespace 列表（格式：ID:名称:描述）===
NAMESPACE_LIST=(
  "802e8b2e-7a3e-419b-8fe2-b623130de0ff:dev-local-v2:云商平台开发及本地联调用"
  "ert:ert:事件驱动溯源项目用"
  "yudao:yudao:yudao脚手架用"
  "pi:pi:流水线集成项目"
)
#
# === 确认操作 ===
echo "⚠️ 注意：此操作将删除以下 namespace 并重新创建，同时刷新配置："
for entry in "${NAMESPACE_LIST[@]}"; do
  IFS=":" read -r ID NAME DESC <<< "$entry"
  NAME=$(echo "$NAME" | tr -d '\r' | xargs)
  echo " - ID=$ID, 名称=$NAME"
done
echo "📂 配置目录：$CONFIG_DIR"

read -p "是否继续执行？输入 yes 开始（其他任意键退出）：" CONFIRM
if [[ "$CONFIRM" != "yes" ]]; then
  echo "🚫 已取消操作。"
  exit 1
fi

# === 删除已有 namespace ===
echo "🧹 删除已有 namespace..."
for entry in "${NAMESPACE_LIST[@]}"; do
  IFS=":" read -r ID NAME DESC <<< "$entry"
  NAME=$(echo "$NAME" | tr -d '\r' | xargs)
  curl -s -X DELETE "http://$NACOS_ADDR/nacos/v1/console/namespaces?namespaceId=$ID" \
    -u "$USERNAME:$PASSWORD" \
    -w "\n✅ 已请求删除 namespace: $ID\n"
done

sleep 2

# === 创建 namespace ===
echo "🚀 开始创建 namespace..."
for entry in "${NAMESPACE_LIST[@]}"; do
  IFS=":" read -r ID NAME DESC <<< "$entry"
  NAME=$(echo "$NAME" | tr -d '\r' | xargs)
  curl -s -X POST "http://$NACOS_ADDR/nacos/v1/console/namespaces" \
    -d "customNamespaceId=$ID" \
    -d "namespaceName=$NAME" \
    -d "namespaceDesc=$DESC" \
    -u "$USERNAME:$PASSWORD" \
    -w "\n✅ 已创建 namespace: $ID\n"
done
sleep 2

# === 删除 public namespace 配置（只删除一次） ===
echo "一、🧹 删除 public namespace 下的所有配置..."
echo "========================================"
RESPONSE=$(curl -s -u "$USERNAME:$PASSWORD" \
  "http://$NACOS_ADDR/nacos/v2/cs/history/configs?namespaceId=")
# echo "$RESPONSE"
# ✅ 判断是否为空数组
if [[ "$RESPONSE" == *'"data":[]'* ]]; then
  echo "✅ 当前 namespace 下没有配置，跳过删除。"
else
  # ✅ 提取所有 dataId 和 group
  CONFIG_LINES=$(echo "$RESPONSE" | grep -oE '{"id":"[^}]*' | sed -E 's/.*"dataId":"([^"]*)".*"group":"([^"]*)".*/\1\t\2/')
  echo "📦 提取到的配置列表如下："
  echo "$CONFIG_LINES"

  # ✅ 删除配置
  while IFS=$'\t' read -r DATA_ID GROUP; do
    echo "➡️ 删除配置：dataId=$DATA_ID, group=$GROUP"
    curl -s -X DELETE \
      -u "$USERNAME:$PASSWORD" \
      "http://$NACOS_ADDR/nacos/v2/cs/config?dataId=$DATA_ID&group=$GROUP&namespaceId=public"
  done <<< "$CONFIG_LINES"

  echo "✅ 配置删除完成。"
fi
echo "========================================"
sleep 1

# === 刷新配置文件 ===
echo "二、🚀 开始刷新配置文件..."

for entry in "${NAMESPACE_LIST[@]}"; do
  IFS=":" read -r ID NAME DESC <<< "$entry"
  NAME=$(echo "$NAME" | tr -d '\r' | xargs)
  NAMESPACE_PATH="$CONFIG_DIR/$NAME"
  echo "========================================"
  echo "🗂️ 处理 namespace: $NAME (ID=$ID)"
  echo "📂 本地目录: $NAMESPACE_PATH"
  if [[ ! -d "$NAMESPACE_PATH" ]]; then
    echo "⚠️  跳过 namespace $NAME：目录不存在 $NAMESPACE_PATH"
    continue
  fi
  # === 删除 namespace 下所有配置 ===
  echo "🧹 删除 namespace = $NAME 下的所有配置..."
  RESPONSE=$(curl -s -u "$USERNAME:$PASSWORD" \
    "http://$NACOS_ADDR/nacos/v2/cs/history/configs?namespaceId=$ID")
  # echo "$RESPONSE"
  # ✅ 判断是否为空数组
  if [[ "$RESPONSE" == *'"data":[]'* ]]; then
    echo "✅ $NAME namespace 下没有配置，跳过删除。"
  else
    # ✅ 提取所有 dataId 和 group
    CONFIG_LINES=$(echo "$RESPONSE" | grep -oE '{"id":"[^}]*' | sed -E 's/.*"dataId":"([^"]*)".*"group":"([^"]*)".*/\1\t\2/')
    # echo "📦 提取到的配置列表如下："
    # echo "$CONFIG_LINES"
    # ✅ 删除配置
    while IFS=$'\t' read -r DATA_ID GROUP; do
      # echo "➡️ 删除配置：dataId=$DATA_ID, group=$GROUP"
      curl -s -X DELETE \
        -u "$USERNAME:$PASSWORD" \
        "http://$NACOS_ADDR/nacos/v2/cs/config?dataId=$DATA_ID&group=$GROUP&namespaceId=$ID"
    done <<< "$CONFIG_LINES"
  echo "✅ 配置删除完成。"
  fi


  # === 上传配置 ===
  success_count=0
  fail_count=0
  failed_files=()
  while read GROUP_DIR; do
    GROUP_NAME=$(basename "$GROUP_DIR")

    while read FILE_PATH; do
      FILE_NAME=$(basename "$FILE_PATH")
      DATA_ID="$FILE_NAME"
      CONTENT=$(<"$FILE_PATH")

      RESP=$(curl -s -o /dev/null -w "%{http_code}" -X POST "http://$NACOS_ADDR/nacos/v2/cs/config" \
        -u "$USERNAME:$PASSWORD" \
        -d "dataId=$DATA_ID" \
        -d "group=$GROUP_NAME" \
        -d "namespaceId=$ID" \
        --data-urlencode "content=$CONTENT")

      if [[ "$RESP" == "200" ]]; then
        ((success_count++))
        echo "✅ 上传成功: $DATA_ID (GROUP=$GROUP_NAME)"
      else
        ((fail_count++))
        failed_files+=("$DATA_ID")
        echo "❌ 上传失败: $DATA_ID (GROUP=$GROUP_NAME), HTTP $RESP"
      fi

    done < <(find "$GROUP_DIR" -type f \( -name "*.yaml" -o -name "*.yml" -o -name "*.properties" -o -name "*.txt" -o -name "*-group"  \))

  done < <(find "$NAMESPACE_PATH" -type d -mindepth 1 -maxdepth 1)
  sleep 2

  # === 打印汇总结果 ===
  # echo "========================================"
  echo "📊 namespace=$NAME (ID=$ID) 刷新完成："
  echo "✅ 成功: $success_count 个"
  echo "❌ 失败: $fail_count 个"

  if (( fail_count > 0 )); then
    echo "❌ 失败文件列表:"
    for file in "${failed_files[@]}"; do
      echo " - $file"
    done
  fi
  echo "========================================"
done
echo "🎉 全部 namespace 和配置已处理完毕！"
